<?php

/**
 * 工厂方法（多态性工厂）模式
 * 
 * 概述：定义一个用于创建对象的接口，让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
 * 
 * 类型：创建型模式
 * 
 * 角色：
 * 	1，抽象工厂。
 *  2，具体工厂。
 *  3，抽象产品。
 *  4，具体产品。
 * 
 * 优点：
 *  1，增加新产品时不需要修改原有的工厂和产品类。
 * 
 * 缺点：
 *  1，每增加一个产品就要增加对应的工厂类。
 */

/**
 * 抽象工厂。
 */
interface Factory
{
	public function createProduct();
}

/**
 * 具体工厂A，生产产品A
 */
class ConcreteFactoryA implements Factory
{
	public function createProduct()
	{
		return new ConcreteProductA();
	}
}

/**
 * 具体工厂B，生产产品B
 */
class ConcreteFactoryB implements Factory
{
	public function createProduct()
	{
		return new ConcreteProductB();
	}
}

/**
 * 抽象产品
 */
interface Product
{
	
}

/**
 * 具体产品A
 */
class ConcreteProductA implements Product
{
	
}

/**
 * 具体产品B
 */
class ConcreteProductB implements Product
{
	
}

class Client
{
	public static function main()
	{
		echo '工厂方法模式：不同的工厂创建不同的产品。<br/>';
		echo 'A工厂创建A产品。<br/>';
		$factoryA = new ConcreteFactoryA();
		$product = $factoryA->createProduct();
		
		echo 'B工厂创建B产品。<br/>';
		$factoryB = new ConcreteFactoryB();
		$product = $factoryB->createProduct();
	}
}

Client::main();